在阅读本文之前,你可能对以下资源贴有兴趣:
Selenium with Python官方文档
Python爬虫利器五之Selenium的用法
用python玩转selenium
selenium和phantomjs爬取动态网页
导航
页面交互
仅仅打开一个网页对我们来说是没有什么价值的,我们使用selenium的目的在于和网页进行交互,做一些真实用户会做的操作,比如点击确定,和输入账号密码登陆。
文本框
比如,给定一段html代码如下:
1
| <input type="text" name="passwd" id="passwd-id" />
|
这段代码块要求我们提交密码,要做两件事情,第一,定位到这一个页面元素(密码文本框),第二,对这个元素输入密码内容。我们可以这样获取它:
1 2 3 4
| element = driver.find_element_by_id("passwd-id") element = driver.find_element_by_name("passwd") element = driver.find_elements_by_tag_name("input") element = driver.find_element_by_xpath("//input[@id='passwd-id']")
|
如果有多个元素匹配了 xpath,它只会返回第一个匹配的元素。如果没有找到,那么会抛出 NoSuchElementException的异常。
当你得到了这个元素,你可以向它提交文本内容:
1
| element.send_keys("some text")
|
又或者模拟点击某个按键。
1
| element.send_keys("and some", Keys.ARROW_DOWN)
|
你可以对任何获取到到元素使用 send_keys 方法,就像你在 GMail 里面点击发送键一样。不过这样会导致的结果就是输入的文本不会自动清除。所以输入的文本都会在原来的基础上继续输入。你可以用下面的方法来清除输入文本的内容。
选择框
WebDriver提供了一个Select类,可以很好处理选择框的交互问题。
1 2 3 4 5
| from selenium.webdriver.support.ui import Select select = Select(driver.find_element_by_name('name')) select.select_by_index(index) select.select_by_visible_text("text") select.select_by_value(value)
|
WebDriver也提供了取消选项的方法,下面举例取消全部选项;
1 2
| select = Select(driver.find_element_by_id('id')) select.deselect_all()
|
WebDriver也提供了返回全部选项内容的办法,下面举例得到全部选项:
1 2 3
| select = Select(driver.find_element_by_xpath("xpath")) all_selected_options = select.all_selected_options options = select.options
|
提交表单
当我们把表单填好,下一步就是点击确定(submit),提交表单内容。
方法一,找到Submit按钮,并调用Click()方法:
1 2
| driver.find_element_by_id("submit").click()
|
方法二,WebDriver 中每个元素都有Submit的方法可以调用,这表明可以单独提交某个元素。
WebDriver 会在表单中寻找它所在的表单,如果发现这个元素并没有被表单所包围,那么程序会抛出NoSuchElementException 的异常。
元素拖曳
要完成元素的拖拽,首先你需要指定被拖动的元素和拖动目标元素,然后利用 ActionChains 类来实现。
1 2 3 4 5 6
| element = driver.find_element_by_name("source") target = driver.find_element_by_name("target") from selenium.webdriver import ActionChains action_chains = ActionChains(driver) action_chains.drag_and_drop(element, target).perform()
|
浏览窗口切换
弹窗处理
浏览历史
Cookies
Q & A
如何滚动窗口到页面底部?
你可以使用execute_script方法执行页面上的javascript 脚本,所以你可以滚动到页面底部或者到任意位置。
以下是一个滚动到页面底部的例子:
1
| driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
|
DOM中的window对象有一个scrollTo 方法,scrollHeight是所有元素的共同属性,document.body.scrollHeight给出了整个页面的高度值。
如何对当前窗口截图
使用webdriver提供的save_screenshot 方法:
1 2 3 4 5 6
| from selenium import webdriver driver = webdriver.Firefox() driver.get('http://www.python.org/') driver.save_screenshot('screenshot.png') driver.quit()
|
如何上传文件
选择<input type="file">元素,然后在send_keys()中输入文件所在路径。